package com.warm.base.design.c_singleton;

/**
 * @Date: 2019/11/21 16:36
 * @Author: LChuang
 * @Description:
 */
public class LazySingleton {

    /**
     *  2. 懒汉模式 -- 用的时候才实例化对象 -- 线程不安全
     *  缺点: 第一次创建时速度相比饿汉模式慢,需要消耗cpu去创建对象; 并发情况下,会造多架战机
     */

    //private static LazySingleton b;

    private LazySingleton(){}

    /*public LazySingleton getInstance(){
        if(b == null){
            b = new LazySingleton();
        }
        return b;
    }*/

    /**
     *  2.1 懒汉模式升级版 -- 线程安全(方法加入同步锁)
     *  缺点: 调用前必须加锁排队,造成时间浪费,不能发挥cpu多核优势
     */
    //加入同步锁
    /*public synchronized LazySingleton getInstance(){
        if(b == null){
            b = new LazySingleton();
        }
        return b;
    }*/


    /**
     *  2.2 懒汉模式终极版 -- 线程安全(双重校验锁)
     */
    private static volatile LazySingleton b;
    //双重校验锁
    public LazySingleton getInstance(){
        //不用排队直接进入方法
        if(b == null){
            //如果没有造战机,进入排队
            synchronized (LazySingleton.class){
                //第一个人造完战机, 其他排队的人散了
                if (b == null){
                    b = new LazySingleton();
                }
            }
        }
        return b;
    }
}
